#pragma once

#include <conio.h>
#include <d3d9.h>
#include <d3dx9tex.h>
#include <D3dx9core.h>
#include <string>
#include <cmath>
#include <fstream>
#include "globals2.h"
using namespace std;

inline float degToRadA(float deg) {
	return deg*(D3DX_PI/180.0f);
}

inline float radToDegA(float rad) {
	return rad*(180.0f/D3DX_PI);
}

class Object {
protected:
	D3DMATERIAL9* MeshMaterials;
	LPDIRECT3DTEXTURE9* MeshTextures;
	DWORD NumMaterials;
	LPD3DXMESH MeshSysMem;

	D3DXMATRIX matMove;
	D3DXMATRIX meshMatrix, transMatrix, scaleMatrix, rotateMatrix, rotateMatrixX, rotateMatrixY, rotateMatrixZ;

	string modelFile;
	string dataFile;
	string iconLocation;
	string name;
	string alignment;

	float distanceToCamera;
public:
	Object();
	Object(string mFile, string dFile, string iconLoc, string n, string a, D3DXMATRIX tMatrix);
	~Object();
	void deallocateMemory(void);
	bool initializeObject(LPDIRECT3DDEVICE9 &pDevice);
	void updateMesh(void);
	void drawMesh(LPDIRECT3DDEVICE9 &pDevice);

	void setObjectLocation(float x, float y, float z);
	void moveObject(float x, float y, float z);
	void setObjectScale(float x, float y, float z);
	void scaleObject(float x, float y, float z);
	void rotateObject(float x, float y, float z);
	void setMeshMatrix(D3DXMATRIX mMatrix);
	void setTransMatrix(D3DXMATRIX tMatrix);
	void setScaleMatrix(D3DXMATRIX sMatrix);
	void setRotateMatrix(D3DXMATRIX rMatrix);
	void setRotateXMatrix(D3DXMATRIX rXMatrix);
	void setRotateYMatrix(D3DXMATRIX rYMatrix);
	void setRotateZMatrix(D3DXMATRIX rZMatrix);
	void setAllMatrix(D3DXMATRIX mMatrix, D3DXMATRIX tMatrix, D3DXMATRIX sMatrix, D3DXMATRIX rMatrix, 
		D3DXMATRIX rXMatrix, D3DXMATRIX rYMatrix, D3DXMATRIX rZMatrix);
	void setMaterials(D3DMATERIAL9* MMaterials, DWORD numMaterials, LPD3DXMESH MSysMem);
	void setAlignment(string a);
	void setDistToCam(float dist);

	D3DXMATRIX getMMatrix(void);
	D3DXMATRIX getTMatrix(void);
	D3DXMATRIX getSMatrix(void);
	D3DXMATRIX getRMatrix(void);
	D3DXMATRIX getRXMatrix(void);
	D3DXMATRIX getRYMatrix(void);
	D3DXMATRIX getRZMatrix(void);
	D3DMATERIAL9* getMeshMaterials(void);
	DWORD getNumMaterials(void);
	LPD3DXMESH getMeshSysMem(void);

	string getModelFile(void);
	string getDataFile(void);
	string getIconLocation(void);
	string getName(void);
	string getAlignment(void);
	float getDistToCam(void);

	XYZ getPosition(void);
	XYZ getScale(void);
	XYZ getRotation(void);

	virtual void saveInfoToFile(ofstream &out);
};